package com.example.excel.format;

import org.apache.poi.ss.usermodel.Cell;

import java.text.DecimalFormat;

public interface CellValueFormatListener {

    /**
     * 格式化单元格内容
     * @param cell Excel单元格 通过cell.getCellTypeEnum()获取单元格的格式，格式类型查看 @see{org.apache.poi.ss.usermodel.CellType}
     * @param typeClass 接收的数据类型
     * @return Excel单元格转化后的数据
     */
    <K> K formatValue(Cell cell, Class<K> typeClass);


    class CellValueFormat implements CellValueFormatListener {

        //格式化小数位
        DecimalFormat df = new DecimalFormat("0.##");

        public <K> K formatValue(Cell cell, Class<K> typeClass) {
            Object value = null;
            switch (cell.getCellTypeEnum()) {
                case _NONE:
                    //常规？
                    break;
                case NUMERIC:
                    //数值 ； double value = cell.getNumericCellValue()
                    return formatValueNumeric(cell, typeClass);
                case STRING:
                    //字符串 ； String value = cell.getStringCellValue()
                    return formatValueString(cell, typeClass);
                case FORMULA:
                    //公式？                value = cell.get();
                    break;
                case BLANK:
                    //空白
                    break;
                case BOOLEAN:
                    //布尔
                    value = cell.getBooleanCellValue();
                    break;
                case ERROR:
                    break;
            }
            if(value == null && typeClass == String.class){
                return (K)"";
            }
            return (K)value;
        }

        /**
         * Cell 等于 NUMERIC 类型
         * 接收类型 已适配 { Double、String、Integer}
         */
        protected <K> K formatValueNumeric(Cell cell, Class<K> typeClass) {
            Double value = cell.getNumericCellValue();
            if (value.getClass() == typeClass) {
                return (K)value;
            } else if (String.class == typeClass) {
                return (K)df.format(value);
            } else if (Integer.class == typeClass) {
                return (K)Integer.valueOf(value.intValue());
            }
            return (K)value;
        }

        /**
         * Cell 等于 String 类型
         * 接收类型 已适配 { Double、String、Integer}
         */
        protected <K> K formatValueString(Cell cell, Class<K> typeClass) {
            String value = cell.getStringCellValue();
            if (value.getClass() == typeClass) {
                return (K)value;
            } else if(Integer.class == typeClass){
                return (K)Integer.valueOf(value);
            } else if(Double.class == typeClass){
                return (K)Double.valueOf(value);
            }
            return (K)value;
        }
    }
}
